for TS) and allow only the same physical flags to be written
back to CR0 by a guest.
Add write-to-CR4 emulation, but check that the write does not
modify any CR4 flags.
Signed-off-by: Keir Fraser <keir@xensource.com>
switch ( modrm_reg )
{
case 0: /* Read CR0 */
- *reg = v->arch.guest_context.ctrlreg[0];
+ *reg = (read_cr0() & ~X86_CR0_TS) |
+ v->arch.guest_context.ctrlreg[0];
break;
case 2: /* Read CR2 */
switch ( modrm_reg )
{
case 0: /* Write CR0 */
+ if ( (*reg ^ read_cr0()) & ~X86_CR0_TS )
+ {
+ DPRINTK("Attempt to change unmodifiable CR0 flags.\n");
+ goto fail;
+ }
(void)do_fpu_taskswitch(!!(*reg & X86_CR0_TS));
break;
UNLOCK_BIGLOCK(v->domain);
break;
+ case 4:
+ if ( *reg != (read_cr4() & ~(X86_CR4_PGE|X86_CR4_PSE)) )
+ {
+ DPRINTK("Attempt to change CR4 flags.\n");
+ goto fail;
+ }
+ break;
+
default:
goto fail;
}